import express from "express";
import { createServer } from "http";
import { fileURLToPath, URL } from "url";
import { Server } from "socket.io";

// 创建 express 实例
const app = express();
// 将 express 实例 给到 createServer，来创建 http 服务
const httpServer = createServer(app);
// 创建 socketio 的实例
const io = new Server(httpServer, { cors: true });

// 监听客户端的链接
io.on("connection", (socket) => {
  // 1. 获取传递过来的 nickName
  const { nickName } = socket.handshake.query;
  console.log("客户端链接进来了 nickName", nickName);

  // 2. 将 nickName 写入到当前的 socket 对象上，方便后续读取
  socket.nickName = nickName;

  // 3. 广播
  //    socket.broadcast ，是排除当前 socket 之外的其他客户端
  socket.broadcast.emit("welcome", "欢迎 " + nickName + " 进入聊天室");
  socket.emit("welcome", "欢迎 " + nickName + " 进入聊天室");

  // 4. 监听客户端发来的 message 事件
  socket.on("message", (payload) => {
    socket.broadcast.emit("message", {
      nickName: socket.nickName,
      msg: payload,
    });
    socket.emit("message", {
      nickName: socket.nickName,
      msg: payload,
    });
  });
});

// console.log("import.meta.url", import.meta.url);
// console.log("===", new URL("./public", import.meta.url));
// console.log("===", fileURLToPath(new URL("./public", import.meta.url)));
// 将 public 文件夹，静态资源托管
//    当前 后端使用的 type module, 导致 ___dirname 使用不了了。
app.use(express.static(fileURLToPath(new URL("./public", import.meta.url))));

app.get("/login", (req, res) => {
  res.send("login");
});

// 监听一个端口号，启动服务
httpServer.listen(3000);
